
import { reactive } from "./ractive"
import { tracker, trigger } from "./effect"

const isObject = (val : any) => {
    return val !== null && typeof val === 'object'
}

// 转换为响应式reactive对象
const toReactive =(value) => {
    // 如果是对象，则转换为reactive对象
    return isObject(value) ? reactive(value) : value
}

export const ref = <T>(value : T) => {
    return new RefImpl<T>(value)
}

class RefImpl <T> {
    private _value: T
    constructor(value) {
        this._value = toReactive(value)
    }

    get value() {
        // 依赖收集
        tracker(this, 'value')
        return this._value
    }
    set value(newValue) {
        // 如果新旧值相同，直接返回，不触发更新
        if (this._value == newValue) return
        // 触发更新
        this._value = toReactive(newValue)
        // 通知更新
        trigger(this, 'value')
    }
}